﻿using System;

namespace DimensionsHelper.Common.Metadata.Script;

/// <summary>
///     字符串常量表达式。可以使用''或""表示。
/// </summary>
public class StringExpression : LiteralExpression
{
    /// <summary>
    ///     字符串常量表达式。可以使用''或""表示。
    /// </summary>
    public StringExpression(int start) : base(LiteralKinds.String, start)
    {
    }

    /// <summary>
    ///     当前字符串表达式去掉引号后的值。
    /// </summary>
    public string Value { get; internal set; } = string.Empty;


    public override void Finish(int end, string text)
    {
        base.Finish(end, text);

        if (text.Length < 2)
        {
            throw new Exception("字符串表达长度过短。");
        }

        Value = text.Substring(1, text.Length - 2);
    }

    /// <summary>
    ///     尝试将当前字符串转换成整数。
    /// </summary>
    /// <param name="result"></param>
    /// <returns></returns>
    public bool TryConvertToInt(out int result)
    {
        return int.TryParse(Value, out result);
    }

    /// <summary>
    ///     尝试将当前字符串转换成小数。
    /// </summary>
    /// <param name="result"></param>
    /// <returns></returns>
    public bool TryConvertToDouble(out double result)
    {
        return double.TryParse(Value, out result);
    }

    /// <summary>
    ///     尝试将当前字符串转换成时间。
    /// </summary>
    /// <param name="result"></param>
    /// <returns></returns>
    public bool TryConvertToDate(out DateTime result)
    {
        return DateTime.TryParse(Value, out result);
    }

    /// <summary>
    ///     尝试将当前字符串转换成布尔值。
    /// </summary>
    /// <param name="result"></param>
    /// <returns></returns>
    public bool TryConvertToBoolean(out bool result)
    {
        return bool.TryParse(Value, out result);
    }

    public override ExpressionBasicType Evaluate()
    {
        return new ExpressionString(Value);
    }
}